public class Liczba {

    private int n;
    Liczba(){
    }
    Liczba(int n){
        this.n = n;
    }
    Liczba(String n, int podstawa) throws LiczbaException{
        char[] tab = new StringBuffer(n).reverse().toString().toCharArray();
        int akumulator=0;
        //zamiana na system 10
        for (int i = 0; i < tab.length; i++) {
            int wartosc =0;
            if(!Character.isDigit(tab[i]))
            {
                wartosc = zamien(tab[i]);//zwraca wyjatek jesli znak nie jest ABCDEF
            }
            else
                wartosc = Character.getNumericValue(tab[i]);

            if(wartosc >= podstawa)
                throw new LiczbaException(n + " : Wartosc nie wystepuje w tym systemie liczbowym");

            akumulator += Math.pow(podstawa,i) * wartosc;
        }
        this.n = akumulator;
    }
    // 1011 = 11 dziesietnie
    //
    // 2^0 * 1 + 2^1 * 1 + 2^2 * 0 + 2^3 * 1
    public String zapis(int podstawa)throws LiczbaException{

        if( podstawa < 2 || podstawa >16)
            throw new LiczbaException(podstawa+" Podstawa nie zawiera się w przedziale.");

        String temp ="";
        int tempN=n;
        while(tempN>0){
            int reszta = tempN%podstawa;
            if(reszta >= 10){
                temp+=zamien(reszta);
            }
            else{
                temp+=reszta;
                }
            tempN=tempN/podstawa;
        }
        return new StringBuffer(temp).reverse().toString();
        // String reverse = new StringBuffer(string).reverse().toString();
        //
    }

    private int zamien(char wartosc) throws LiczbaException {
        switch(Character.toUpperCase(wartosc))
        {
            case 'A':  return 10;
            case 'B':  return 11;
            case 'C':  return 12;
            case 'D':  return 13;
            case 'E':  return 14;
            case 'F':  return 15;
        }
        throw new LiczbaException("Bledna liczba");
    }
    private String zamien(int reszta){
      switch (reszta){
          case 10:  return "A";
          case 11:  return "B";
          case 12:  return "C";
          case 13:  return "D";
          case 14:  return "E";
          case 15:  return "F";
      }
        return "";
    }
}